카펫

NOTE

프로그래머스 Lv2 · 완전탐색 + 약수 탐색(수식 변형) 갈색 테두리가 노란색을 감싸는 직사각형의 가로·세로를 찾는 문제. 전체 면적의 약수 쌍을 탐색하면 O(√N)으로 끝난다.

📝 문제

  • 갈색(brown)이 노란색(yellow)을 감싸는 직사각형 카펫. 가로 ≥ 세로.
  • 전체 격자 = brown + yellow. 가로·세로 길이를 반환.
BBBBBBBB
BYYYYYYB   ← 바깥 테두리 = brown, 안쪽 = yellow
BYYYYYYB
BBBBBBBB

💡 접근

수식 유도:

  • 내부 노란색: yellow = (width - 2) * (height - 2)
  • 전체 면적: width * height = brown + yellow

이 두 식을 동시에 만족하는 (width, height)를 찾으면 된다.

약수 기반 탐색(권장 패턴): total = brown + yellow의 약수 쌍이 곧 (height, width) 후보다. height3 ~ √total까지만 돌리면 되므로 2중 for문(O(N²))보다 빠르다.

⌨️ 풀이

private int[] solution(int brown, int yellow) {
 
    int total = brown + yellow;
 
    for (int height = 3; height <= Math.sqrt(total); height++) {
 
        if (total % height == 0) {
 
            int width = total / height;
 
            if ((width - 2) * (height - 2) == yellow) {
                return new int[]{width, height};
            }
        }
    }
 
    return new int[]{};
}

⏱️ 복잡도 비교

방법시간복잡도
2중 for문(완전탐색)O(N²)
약수 탐색O(√N)

📎 실수 포인트

실수이유
brown 공식 직접 계산실수 유발 (면적 - yellow가 안전)
width ≥ height 조건 누락오답
3 이상 조건 미적용테두리가 성립 안 함

핵심 한 줄: 직사각형 조건 문제는 “전체 면적 → 약수 탐색”이 1순위다.


🔗 관련